package com.it.schoolbookshop_back.mapper;

import com.it.schoolbookshop_back.entities.po.Transaction;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 订单数据访问接口
 */
@Mapper
public interface OrderMapper {
    
    /**
     * 保存订单
     * @param transaction 订单信息
     * @return 影响的行数
     */
    int saveTransaction(Transaction transaction);
    
    /**
     * 根据订单ID获取订单信息
     * @param id 订单ID
     * @return 订单信息
     */
    Transaction getTransactionById(@Param("id") Integer id);
    
    /**
     * 根据订单号获取订单信息
     * @param orderId 订单号
     * @return 订单信息列表
     */
    List<Transaction> getTransactionByOrderId(@Param("orderId") String orderId);
    
    /**
     * 更新订单状态
     * @param id 订单ID
     * @param status 订单状态
     * @return 影响的行数
     */
    int updateTransactionStatus(@Param("id") Integer id, @Param("status") String status);
    
    /**
     * 根据订单号更新订单状态
     * @param orderId 订单号
     * @param status 订单状态
     * @return 影响的行数
     */
    int updateTransactionStatusByOrderId(@Param("orderId") String orderId, @Param("status") String status);
    
    /**
     * 根据买家ID获取订单列表
     * @param buyerId 买家ID
     * @return 订单列表
     */
    List<Transaction> getTransactionsByBuyerId(@Param("buyerId") Integer buyerId);
    
    /**
     * 根据订单号获取所有交易
     * @param orderId 订单号
     * @return 交易列表
     */
    List<Transaction> getTransactionsByOrderId(@Param("orderId") String orderId);
    
    /**
     * 查询所有订单
     * 按照订单号分组，只返回特定字段(id, order_id, status, created_at, updated_at)
     * @param status 订单状态（可选）
     * @return 订单列表
     */
    List<Map<String, Object>> getAllOrders(@Param("status") String status);
    
    /**
     * 查询指定用户的订单
     * 按照订单号分组，只返回特定字段(id, order_id, status, created_at, updated_at)
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @return 订单列表
     */
    List<Map<String, Object>> getUserOrders(@Param("userId") Integer userId, @Param("status") String status);
    
    /**
     * 查询订单详情
     * 根据订单号查询订单相关信息，包括书籍和卖家信息
     * @param orderId 订单号
     * @return 订单详情列表
     */
    List<Map<String, Object>> getOrderDetailByOrderId(@Param("orderId") String orderId);
}
